import { Disposable, Event } from '../../utils';

import { IShellLaunchConfig } from './pty';
import {
  IObservable,
  ISettableObservable,
} from '@opensumi/monaco-editor-core/esm/vs/base/common/observableInternal';

// 终端小部件接口，继承自 Disposable
export interface IWidget extends Disposable {
  dynamic: IObservable<number>; // 动态尺寸（可观察）
  shadowDynamic: IObservable<number>; // 阴影动态尺寸（可观察）
  name: ISettableObservable<string>; // 终端名称（可设置可观察）
  processName: ISettableObservable<string>; // 进程名称（可设置可观察）

  id: string; // 小部件唯一标识
  element: HTMLDivElement; // 关联的 DOM 元素
  group: IWidgetGroup; // 所属分组
  reuse: boolean; // 是否可复用
  recovery: boolean; // 是否可恢复
  show: boolean; // 是否显示
  error: boolean; // 是否出错

  resize: (dynamic?: number) => void; // 调整尺寸
  increase: (increment: number) => void; // 增加尺寸
  rename(name: string): void; // 重命名
  dispose: () => void; // 释放资源
  onRender: Event<void>; // 渲染事件
  onResize: Event<void>; // 尺寸调整事件
  onShow: Event<boolean>; // 显示事件
  onError: Event<boolean>; // 错误事件
}

// 终端小部件分组接口，继承自 Disposable
export interface IWidgetGroup extends Disposable {
  name: IObservable<string>; // 分组名称（可观察）
  snapshot: IObservable<string>; // 快照（可观察）
  activated: IObservable<boolean>; // 是否激活（可观察）
  editable: IObservable<boolean>; // 是否可编辑（可观察）
  widgets: IObservable<IWidget[]>; // 分组下的小部件列表（可观察）

  id: string; // 分组唯一标识
  options?: IShellLaunchConfig; // 启动配置
  length: number; // 小部件数量
  widgetsMap: Map<string, IWidget>; // 小部件映射表
  last: IWidget; // 最后一个小部件
  addWidget(widget: IWidget): void; // 添加小部件
  removeWidgetByIndex: (index: number) => IWidget; // 通过索引移除小部件
  edit(): void; // 进入编辑状态
  unedit(): void; // 退出编辑状态
  rename(name: string): void; // 重命名分组
  dispose: () => void; // 释放资源
}
